#include "adc_dianweiqi.h"
#include <stdio.h>
/**
 *  PC4,模拟输入,浮空
 */
void adc_dianweiqi_gpio_pc4_config()
{
    //
    rcu_periph_clock_enable(RCU_GPIOC);
    gpio_mode_set(GPIOC, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_4);
}

/**
 * ADC0,1_IN14
 */
void ac_dianweiqi_adc_config()
{
    /******************** ADC config **********************/
    // 配置时钟
    rcu_periph_clock_enable(RCU_ADC0);
    // 重置
    adc_deinit();
    // 配置主频
    adc_clock_config(ADC_ADCCK_PCLK2_DIV4);
    ////////// 采样配置
    // 分辨率
    adc_resolution_config(ADC0, ADC_RESOLUTION_12B);
    // 数据右对齐
    adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);

    // 启用ADC模块对内部温度传感器（ADC_IN16）和内部参考电压（ADC_IN17）等特定内部通道的访问权限
    // adc_channel_16_to_18(ADC_TEMP_VREF_CHANNEL_SWITCH, ENABLE);

    // 规则配置
    // 配置通道和通道数量
    // 普通通道
    adc_routine_channel_config(ADC0, 0, ADC_CHANNEL_14, ADC_SAMPLETIME_15); // 每15个时钟周期，获取1个样本
    adc_channel_length_config(ADC0, ADC_ROUTINE_CHANNEL, 1);

    // 模式配置
    adc_special_function_config(ADC0, ADC_SCAN_MODE, DISABLE);       // 取消扫描模式
    adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, DISABLE); // 取消连续模式

    // 打开ADC
    adc_enable(ADC0);

    // 校准ADC
    adc_calibration_enable(ADC0);
    delay_1ms(100); // 给校准一定时间
}

void adc_dianweiqi_config(void)
{
    adc_dianweiqi_gpio_pc4_config();
    ac_dianweiqi_adc_config();
}

float adc_dianweiqi_get(void)
{
    // 触发ADC采样
    adc_software_trigger_enable(ADC0, ADC_ROUTINE_CHANNEL);
    // 等待ADC采样并且转化完成
    while (RESET == adc_flag_get(ADC0, ADC_FLAG_EOC))
        ;
    adc_flag_clear(ADC0, ADC_FLAG_EOC);
    // 获取采样结果数据
    uint16_t value = adc_routine_data_read(ADC0);

    // ADC数值 -> 电压值 ( Vtemp / 3.3 = adc_val / 4095)
    float Vtemp = ((float)value) / 4095.0f; // 最大值是4095,4096只能显示到99%

    printf("电位器:%d\n", value); // 1424 - 3818

    return Vtemp;
}
